package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"hanyun-admin/src/controller"
	"hanyun-admin/src/utils"
	"net/http"
)

func main() {
	router := gin.Default()
	router.StaticFS("/profile", http.Dir("D:/ruoyi/uploadPath"))
	router.POST("/login", controller.LoginController) //登录
	router.GET("/captcha", controller.GenerateCaptchaHandler)
	router.GET("/getInfo", controller.GetLoginUserInfo)
	router.GET("/getRouters", controller.GetRouters)
	router.GET("/profile", controller.ProFile) //个人信息
	router.POST("/logout", controller.Logout)  //退出登录
	router.PUT("/profile", controller.GetUpdateLoginUserInfo)
	//用户模块路由
	userGroup := router.Group("/system/user")
	{
		userGroup.GET("/list", controller.GetSysUserList)                 //用户列表
		userGroup.GET("/info/:userId", controller.GetSysUserInfoByUserId) //查询用户详情
		userGroup.PUT("/resetPwd", controller.UpdateUserPasswordByUserId) //修改用户密码
		userGroup.PUT("/changeStatus", controller.ChangeUserStatus)       //用户状态修改
		userGroup.GET("/addView", controller.AddViewUserData)             //由于路由冲突问题 不得不这样写 新增按钮返回岗位角色数据
	}
	//岗位路由模块
	postGroup := router.Group("/system/post")
	{
		postGroup.GET("/list", controller.GetPostList)                 //岗位数据列表
		postGroup.GET("/post/:postId", controller.GetPostInfoByPostId) //岗位数据详情
		postGroup.POST("/add", controller.AddSysPost)                  //添加
		postGroup.PUT("/add", controller.UpdateSysPostData)            //修改
		postGroup.DELETE("/:postId", controller.DeleteSysPost)         //删除
	}
	//字典模块路由
	dictGroup := router.Group("/system/dict")
	{
		dictGroup.GET("/type/list", controller.GetDictTypeList)           //字典类型列表
		dictGroup.GET("/types/:dictId", controller.GetDictTypeInfo)       //字典详情
		dictGroup.POST("/type", controller.AddSysDictType)                //保存字典类型
		dictGroup.PUT("/type", controller.UpdateSysDictType)              //修改字典类型
		dictGroup.DELETE("/type/:dictId", controller.DeleteSysDictType)   //删除字典类型
		dictGroup.GET("/data/list", controller.GetDictDataList)           //获取字典数据
		dictGroup.GET("/datas/:dictCode", controller.GetDictDataInfo)     //字典数据详情
		dictGroup.POST("/data", controller.AddSysDictData)                //新增字典数据
		dictGroup.PUT("/data", controller.UpdateSysDictData)              //更新字典数据
		dictGroup.DELETE("/data/:dictCode", controller.DeleteSysDictData) //删除字典数据
	}
	//菜单管理模块路由
	menuGroup := router.Group("/system/menu")
	{
		menuGroup.GET("/list", controller.GetMenuList)            //数据列表
		menuGroup.GET("/menu/:menuId", controller.GetSysMenuInfo) //查询菜单详情
		menuGroup.POST("/menu", controller.AddSysMenu)            //新增菜单
		menuGroup.PUT("/menu", controller.UpdateSysMenuData)      //更新数据
		menuGroup.DELETE("/:menuId", controller.DeleteSysMenu)    //删除
	}
	//部门管理模块路由
	deptGroup := router.Group("/system/dept")
	{
		deptGroup.GET("/list", controller.GetSysDeptList)          //数据列表
		deptGroup.GET("/dept/:deptId", controller.GetSysDeptInfo)  //部门详情
		deptGroup.POST("/add", controller.AddSysDeptData)          //添加部门
		deptGroup.PUT("/dept", controller.UpdateSysDeptData)       //更新部门数据
		deptGroup.DELETE("/:deptId", controller.DeleteSysDeptData) //删除部门
		deptGroup.GET("/treeselect", controller.GetDeptTreeList)   //部门树形菜单
	}
	configGroup := router.Group("/system/config")
	{
		configGroup.GET("configKey/sys.user.initPassword", func(c *gin.Context) {
			c.JSON(http.StatusOK, gin.H{
				"code": http.StatusOK,
				"msg":  "123456",
			})
		})
	}
	router.PUT("/system/user/profile/updatePwd", controller.GetUpdateLoginPassword)
	router.GET("/system/dict/data/dictType/:dictType", controller.GetDictDataListByDictType) //数据字典
	router.POST("/system/user/profile/avatar", controller.GetUpdateAvatar)                   //更换头像
	router.Use(Authorize())
	router.POST("/getKey", getKey)
	router.Run(":8080")
}

func getKey(c *gin.Context) {
	//获取token
	token := c.Request.Header.Get("token")
	//获取用户的唯一标识
	jsonStr := utils.GetLoginUserName(token)
	userMap := utils.JsonToMap(jsonStr)
	c.JSON(200, gin.H{
		"msg":    "您的用户名是" + userMap["userName"].(string),
		"status": 0,
	})
	/*//检测key是否存在redis中
	count := utils.CheckRedisExits("loginUser_"+userMap["userName"].(string))
	if count==1 {
		tMap := utils.GetRedisMapByUserName(userMap["userName"].(string))
		fmt.Println(tMap["token"])
		if token == tMap["token"].(string) {
			//验证令牌有效期，相差不足20分钟，自动刷新缓存
			utils.VerifyToken(tMap)
		}
	}else{
		c.JSON(403,gin.H{
			"msg":"你的登录已过期！请重新登录",
			"status":0,
		})
	}*/
}

//token拦截器
func Authorize() gin.HandlerFunc {
	return func(c *gin.Context) {
		//获取token
		token := c.Request.Header.Get("token")
		//获取用户的唯一标识
		jsonStr := utils.GetLoginUserName(token)
		userMap := utils.JsonToMap(jsonStr)
		//检测key是否存在redis中
		count := utils.CheckRedisExits("loginUser_" + userMap["userName"].(string))
		if count == 1 {
			tMap := utils.GetRedisMapByUserName(userMap["userName"].(string))
			fmt.Println(tMap["token"])
			if token == tMap["token"].(string) {
				//验证令牌有效期，相差不足20分钟，自动刷新缓存
				utils.VerifyToken(tMap)
			}
			c.Next()
		} else {
			c.JSON(403, gin.H{
				"msg":    "你的登录已过期！请重新登录",
				"status": 0,
			})
			c.Abort()
		}
	}
}
